package br.org.acessobrasil.portal.action;

import java.security.NoSuchAlgorithmException;
import java.util.Random;

import org.apache.log4j.Logger;

import br.com.goals.tableedit.util.MD5;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.UsuarioDaoSpring;
import br.org.acessobrasil.portal.util.G_Email;

 /**
 * Sistema de recupera��o de senha.
 * 
 * Ao ser requisitado a recupera��o de senha,
 * ele verifica se o usu�rio possui um Hash,
 * se n�o possuir ele gera um e envia para o email do usu�rio um link com o hash.
 * 
 * Ao pressionar o link, ser� gerada uma nova senha para o usu�rio.
 * 
 * Tamb�m poder� ser adicionado o hash manualmente na pagina de recupera��o de senha.
 * 
 * @author Enrique Baliosian
 *
 */

public class LembrarSenhaGerenciador extends Super{
	private static final long serialVersionUID = 1L;
	private static Logger logger = Logger.getLogger(LembrarSenhaGerenciador.class);
	private String email;
	private String hash;
	protected String mensagemSenha;
	
	public String enviarEmail() throws NoSuchAlgorithmException{
		try{
			if(email != null && !email.equals("")){
				try{
					logger.debug("Email preenchido");
					if(hash != null && !hash.equals("")){
						try{
							logger.debug("Verificando Hash (n&atilde;o null ou vazio)");
							Usuario usuario = UsuarioDaoSpring.getInstance().procurarPorEmail(email);
							Usuario senhaHash = UsuarioDaoSpring.getInstance().procurarPorHash(hash);
							if(usuario!=null && senhaHash.equals(senhaHash)){
								try{
									logger.debug("Hash Encontrado");
									logger.debug("Usuario Encontrado");
									String consoantes="bcdfghjklmnpqrstvxwz";
									String vogais="aeiou";
									String nova_senha="";
									Random rd = new Random();
									logger.debug("Gerando nova senha");
									for(int i=0;i<4;i++){
										nova_senha+=consoantes.charAt(rd.nextInt(consoantes.length()));
										nova_senha+=vogais.charAt(rd.nextInt(vogais.length()));
									}
									logger.debug("Alterando senha no banco");
									usuario.setCoSenha(MD5.toPassword(nova_senha));
									UsuarioDaoSpring.getInstance().atualizar(usuario);
									mensagemSenha="O login &eacute; : "+usuario.getCoUsuario()+"\n";
									mensagemSenha+="Sua nova senha &eacute; : "+nova_senha;
									enviarEmailSenha(usuario);
									mensagem = "Senha enviada para o seu e-mail";
								}catch (Exception e) {
									logger.error(e);
								}
							}else{
								return INPUT;
							}
						}catch (Exception e) {
							logger.error(e);
						}
					}else{
						logger.debug("Hash null");
						Usuario usuario = UsuarioDaoSpring.getInstance().procurarPorEmail(email);
						if(usuario!=null){
							try{
								logger.debug("Usuario Encontrado");
								String hash = gerarHash();
								logger.debug("Gerando hash");
								usuario.setHash(hash);
								UsuarioDaoSpring.getInstance().atualizar(usuario);
								logger.debug("Enviando email com hash");
								enviarEmail(usuario);
								mensagem = "O procedimento para recuperar a senha foi enviado para o seu e-mail";
							}catch (Exception e) {
								logger.error(e);
							}
						}else{
							logger.debug("Usuario Desconhecido");
							mensagem = "Este e-mail '"+email.replace("<","")+"' n&atilde;o foi encontrado. Por favor, preencha novamente.";
						}
					}
				}catch (Exception e) {
					logger.error(e);
				}
			}else{
				logger.debug("Usuario Desconhecido");
				mensagem = "Este e-mail '"+email.replace("<","")+"' n&atilde;o foi encontrado. Por favor, preencha novamente.";
			}
		}catch (Exception e) {
			logger.error(e);
		}
		return SUCCESS;
	}
		
	/**
	* Email com hash
	* Gera email recuperando as informa��es do usu�rio no banco.
	* No corpo do email vai anexado o c�digo Hash.
	* @param usuario
	*/
	private void enviarEmail(final Usuario usuario){
		Thread t = new Thread(){
			public void run() {
				try{
					logger.debug("Enviando email para o usuario: "+ usuario.getNoUsuario());
					//Recuperar a url relativa
					String url = getRequest().getRequestURL().toString();
					url = url.substring(0,url.indexOf("/adm/"));
					String link = url+"/adm/lembrarSenhaGerenciador.action?email="+usuario.getNoEmail()+"&hash="+usuario.getHash();
					String mensagem = "Prezado(a) " + usuario.getNoUsuario() + "," +
							" para criar uma nova senha de acesso ao site, por favor acesse o link abaixo:\n\n" +
							"\t"+link+"\n\n" +
							"Ser&aacute; gerada uma senha e enviada para esse email.\n\n\n"+
							"Instru&ccedil;&otilde;es para recupera&ccedil;&atilde;o manual: \n\n" +
							"Caso n&atilde;o consiga acessar o link, v&aacute; at&eacute; a pagina de recupera&ccedil;&atilde;o de senha e insira a chave de seguran&ccedil;a no campo determinado junto com seu email.\n" +
							"Chave de Seguran&ccedil;a: "+usuario.getHash();
					
					mensagem+="\n\n";
					G_Email.enviarHtmlEmail("Envio de senha", mensagem, usuario.getNoEmail(), usuario.getNoUsuario(), "fabio@acessobrasil.org.br", "CMS Admin");
				}catch (Exception e) {
					logger.error("Ocorreu um erro ao enviar o email: ",e);
				}
			}
		};
		t.start();
		logger.debug("Email Enviado com sucesso");
	}

	/**
	 * Email com senha.
	 * Gera email recuperando as informa��es do usu�rio no banco.
	 * No corpo do email vai anexada a senha do usu�rio.
	 * @param usuario
	 */
	private void enviarEmailSenha(final Usuario usuario){
		Thread t = new Thread(){
			public void run() {
				try{
					logger.debug("Enviando email para o usuario: "+ usuario.getNoUsuario());
					G_Email.enviarHtmlEmail("Envio de senha", mensagemSenha, usuario.getNoEmail(), usuario.getNoUsuario(), "fabio@acessobrasil.org.br", "CMS Admin");
				}catch (Exception e) {
					logger.error("Ocorreu um erro ao enviar o email: ",e);
				}
			}
		};
		t.start();
		logger.debug("Email Enviado com sucesso");
	}
	
	/**
	 * Sistema de cria��o de hash.
	 * Gera hash aleat�rio para autentica��o no recadastramento de senha.
	 * @return
	 */
	private String gerarHash(){
		int min = 'A';
		int max = 'Z';
		String res="";
		for(int i=0;i<30;i++){
			char a = (char) (min + (int)((max - min)*Math.random()));
			res+=a;
		}
		return res;
	}
	
	/**
	 * GETs e SETs
	 * Para recupera��o das informa��es do formul�rio lembrarsenhagerenciador.jsp
	 * @return
	 */
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getHash() {
		return hash;
	}
	public void setHash(String hash) {
		this.hash = hash;
	}
	
}